<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        /* 
            继承
                - 可以通过 extends 关键字，将父类中的属性和方法，继承给子类
                - 继承的属性和方法，子类都可以使用
                - 继承的属性和方法，子类可以重写

            封装 - 安全性
            继承 - 扩展性
            多态 - 灵活性
        */
        class Animal {
            constructor(name){
                this.name = name;
            }

            sayHello(){
                console.log('hello');
            }
        }

        class Dog extends Animal {
            // 继承父类的构造函数
            constructor(name){
                // 重写构造函数时, 第一行代码必须为 super(), 保留父类的构造函数
                super(name);  // 调用父类的构造函数
            }

            sayHello(){
                console.log('wang');
            }
        }

        class Cat extends Animal {
            constructor(name){
                super(name);
            }

            sayHello(){
                console.log('miao');
            }
        }
    </script>
</head>

<body>

</body>

</html>